撰寫本系列文章目的在於提升資訊安全之實務能力,
並透過實作體悟到資訊安全領域的重要性,
本系列所有文章之內容皆有一定技術水平,
不得從事非法行為、惡意攻擊等非法活動,
「一切不合法規之行為皆受法律所約束」,
為了避免造成公司、廠商或玩家之間困擾,
所有實作不會拿已上市產品、Online Game 等等來作範例學習,
且部分具有深度、價值之內容,將會提升一定閱讀門檻(不對該技術做分析、解說),
請勿透過本系列文章所學,從事任何非法活動,請不要以身試法!!!
首先開始前要先說一下,
小弟我目前還屬於菜鳥階段,正不斷努力學習中,
若有發現錯誤或不妥之處還請不吝賜教。
歡迎大家多多留言,互相交流交流。
那就開始今天的主題吧~~
大家知道在 kernel mode 也可以建立 Thread 來執行任務嗎?
今天就要來講講簡單跑在 kernel mode 的 thread。
首先使用 InitializeObjectAttributes 來初始化一個指向 OBJECT_ATTRIBUTES 的 Object,
VOID InitializeObjectAttributes(
[out] POBJECT_ATTRIBUTES p,
[in] PUNICODE_STRING n,
[in] ULONG a,
[in] HANDLE r,
[in, optional] PSECURITY_DESCRIPTOR s
);
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES;
建立自己的 Thread Func,然後我們使用 PsCreateSystemThread 建立一個 Kernel Thread:
NTSTATUS PsCreateSystemThread(
PHANDLE ThreadHandle,
ULONG DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
HANDLE ProcessHandle,
PCLIENT_ID ClientId,
PKSTART_ROUTINE StartRoutine,
PVOID StartContext
);
要記得 Sleep 一段時間,不然在 Kernel 中的 Thread 執行權很高,會占用大量 CPU 資源。
在這一個 Thread func 執行完後,要記得終止這個 Thread,不然會造成永久性傷害 XD
再來透過 Thread Handle 獲得 Thread Object ,
可以直接使用 ObReferenceObjectByHandle
NTSTATUS ObReferenceObjectByHandle(
HANDLE Handle,
ACCESS_MASK DesiredAccess,
POBJECT_TYPE ObjectType,
KPROCESSOR_MODE AccessMode,
PVOID *Object,
POBJECT_HANDLE_INFORMATION HandleInformation
);
最後 Unload Driver 時,要記得把前面所述取得的 Object 做 ObDereferenceObject 的動作。
這樣就可以開心跑 Thread 啦~~
因小弟身體不適,後續文章的更新可能會稍微簡略,整體目錄(Day 16 ~ Day 29)將不會一次釋出,還請見諒...
若有斷文,小弟在此說聲抱歉,會在身體康復後寫完 QQ
好了,這篇就講到這結束了,
大家若有發現哪裡寫得不好或錯誤的地方,都留個言討論一下吧 XD
那我們下期見 o( ̄▽ ̄)ブ